﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 聚合行为 - Boid算法的核心行为之一
/// 使个体向周围邻居的中心位置移动，保持群体的聚集性
/// 可在编辑器中创建：Create > Flock > Behavior > Cohesion
/// </summary>
[CreateAssetMenu(menuName = "Flock/Behavior/Cohesion")]
public class CohesionBehavior : FilteredFlockBehavior
{
    /// <summary>
    /// 计算聚合行为的移动向量
    /// 计算邻居的中心位置，使个体向该中心移动
    /// </summary>
    /// <param name="agent">当前个体</param>
    /// <param name="context">邻居对象列表</param>
    /// <param name="flock">所属群体</param>
    /// <returns>聚合行为的移动向量</returns>
    public override Vector2 CalculateMove(FlockAgent agent, List<Transform> context, Flock flock)
    {
        // 如果没有邻居，无需调整
        if (context.Count == 0)
            return Vector2.zero;

        // 计算所有邻居的中心位置
        Vector2 cohesionMove = Vector2.zero;
        
        // 应用过滤器（如果存在）
        List<Transform> filteredContext = (filter == null) ? context : filter.Filter(agent, context);
        
        // 累加所有邻居的位置
        foreach (Transform item in filteredContext)
        {
            cohesionMove += (Vector2)item.position;
        }
        
        // 计算邻居的中心位置
        cohesionMove /= context.Count;

        // 计算从当前位置到邻居中心的偏移向量
        cohesionMove -= (Vector2)agent.transform.position;
        
        return cohesionMove;
    }
}
